// wrapper.h

#pragma once

#include "Facade.h"
#pragma comment (lib,"SpaceBattleDLL.lib")

using namespace System;

namespace wrapper {

	public ref class WrapperFacade
	{
	private:
		Facade* fac;
		
	public:

		  /*!
	  * \brief Constructeur
	  * Constructeur de la classe Facade
	  */
	  WrapperFacade(int n){
		  fac=Facade_New(n);
	  }

  /*	WrapperFacadeJ(int n){
		  fac= Facade_NewJ(n);
	  }*/
	
	  /*!
	  * \brief Destructeur
	  * Destructeur de la classe Facade
	  */
	  ~WrapperFacade(){
		  Facade_Delete(fac);
	  }

	  /*!
	  * \brief Transforme le type string de .NET en string de la STL 
	  * \return string
	  */
	  std::string stringSystemToSTL(System::String^ string){
		  char* tmp = static_cast<char *>(System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(string).ToPointer());
		  std::string res(tmp);
		  System::Runtime::InteropServices::Marshal::FreeHGlobal(IntPtr(tmp));
		  return res;
	  }

	  /*!
	  * \brief Transforme le type string de la STL en string de .NET 
	  * \return String
	  */
	  System::String^ stringSTLToSystem(std::string string){
		  return gcnew String(string.c_str());
	  }

	  int hauteurPlateau(){
		  return fac->getHauteurPlateau();
	  }

	  int largeurPlateau(){
		  return fac->getLargeurPlateau();
	  }


	  System::Collections::Generic::LinkedList<int>^ getCases(){
		  //fac->testFac();
		  std::list<int> list = fac->getCases();
		  std::list<int>::iterator it;
		  System::Collections::Generic::LinkedList<int>^ res = gcnew System::Collections::Generic::LinkedList<int>();
		  for(it=list.begin();it!=list.end();it++){
			  res->AddLast(*it);
		  }
		  return res;
	  }

	  System::Collections::Generic::LinkedList<int>^ getCasesAccessibles(int de1, int de2){
		  //fac->getCasesAccessibles();
		  std::list<int> list = fac->getCasesAccessibles(de1, de2);
		  std::list<int>::iterator it;
		  System::Collections::Generic::LinkedList<int>^ res = gcnew System::Collections::Generic::LinkedList<int>();
		  for(it=list.begin();it!=list.end();it++){
			  res->AddLast(*it);
		  }
		  return res;
	  }

		  System::Collections::Generic::LinkedList<int>^ getInfoFlotte(System::String^ couleur){
		  std::list<int> list = fac->getInfoFlotte(stringSystemToSTL(couleur));
		  std::list<int>::iterator it;
		  System::Collections::Generic::LinkedList<int>^ res = gcnew System::Collections::Generic::LinkedList<int>();
		  for(it=list.begin();it!=list.end();it++){
			  res->AddLast(*it);
		  }
		  return res;
	  }
		

	  void ajoute2Joueurs(System::String^ j1, System::String^ j2, System::String^ c1, System::String^ c2, System::String^ c3, System::String^ c4){
		  fac->ajoute2Joueurs(stringSystemToSTL(j1),stringSystemToSTL(j2),stringSystemToSTL(c1),stringSystemToSTL(c2),stringSystemToSTL(c3),stringSystemToSTL(c4));
	  }

	  void ajoute3Joueurs(System::String^ j1, System::String^ j2, System::String^ j3, System::String^ c1, System::String^ c2, System::String^ c3){
		  fac->ajoute3Joueurs(stringSystemToSTL(j1),stringSystemToSTL(j2), stringSystemToSTL(j3),stringSystemToSTL(c1),stringSystemToSTL(c2),stringSystemToSTL(c3));
	  }

	  void ajoute4Joueurs(System::String^ j1, System::String^ j2, System::String^ j3, System::String^ j4, System::String^ c1, System::String^ c2, System::String^ c3, System::String^ c4){
		  fac->ajoute4Joueurs(stringSystemToSTL(j1),stringSystemToSTL(j2),stringSystemToSTL(j3),stringSystemToSTL(j4),stringSystemToSTL(c1),stringSystemToSTL(c2),stringSystemToSTL(c3),stringSystemToSTL(c4));
	  }

	  void deplacerVaisseau(int c,int l){
		  fac->deplacerVaisseau(c,l);
	  }

	  int posVaisseauCourant(){
		  return fac->posVaisseauCourant();
	  }

	  int lancerDes(){
		  return fac->lancerDes();
	  }

	  bool partieFinie(){
		  return fac->partieFinie();
	  }

	  bool flotteSuivante(){
		  return fac->flotteSuivante();
	  }

	  String^ couleurVaisseauCourant(){
		  return stringSTLToSystem(fac->couleurVaisseauCourant());
	  }

	  String^ gagnant(){
		  return stringSTLToSystem(fac->gagnant());
	  }

    //getCoorVaisseaux()
    System::Collections::Generic::LinkedList<int>^ getCoorVaisseaux(){
	    std::list<int> list = fac->getCoorVaisseaux();
	    std::list<int>::iterator it;
	    System::Collections::Generic::LinkedList<int>^ res = gcnew System::Collections::Generic::LinkedList<int>();
	    for(it=list.begin();it!=list.end();it++){
		    res->AddLast(*it);
	    }
	    return res;
	  }

      // Liste des points de la trajectoire du tir 
    System::Collections::Generic::LinkedList<double>^ calculTrajectoireMissile(double orig_x, double orig_y, double dest_x, double dest_y){
	    std::list<double> list = fac->calculTrajectoireMissile(orig_x, orig_y, dest_x, dest_y);
	    std::list<double>::iterator it;
	    System::Collections::Generic::LinkedList<double>^ res = gcnew System::Collections::Generic::LinkedList<double>();
	    for(it=list.begin();it!=list.end();it++){
		    res->AddLast(*it);
	    }
	    return res;
    }

    bool estTouche(System::String^ couleur){
		  return fac->estTouche(stringSystemToSTL(couleur));
	  }

    void setEstToucheFalse(){
      fac->setEstToucheFalse();
    }
     
    bool estCharge(){
      return fac->estCharge();
    }

	};
}
